home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-11-26 | 28.1 KB | 1,044 lines |
- Newsgroups: comp.sources.misc
- subject: v09i015: FPLAN 5/6
- from: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
- Reply-To: tynor@prism.gatech.edu (Steve Tynor)
-
- Posting-number: Volume 9, Issue 15
- Submitted-by: tynor@prism.gatech.edu (Steve Tynor)
- Archive-name: fplan/part05
-
- #This is part 5/6 of FPLAN
- #!/bin/sh
- # shar: Shell Archiver (v1.22)
- # Packed Mon Nov 20 19:28:40 EST 1989 by gaffa!tynor
- # from directory /files/home/users/tynor/src/fplan
- #
- # Run the following text with /bin/sh to create:
- # main.c
- # misc.c
- # db.c
- # strings.c
- #
- echo "x - extracting main.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > main.c &&
- X/*
- X * $Id: main.c,v 2.12 89/11/11 19:13:48 tynor Exp $
- X *----------------------------------------------------------------------------
- X * FPLAN - Flight Planner
- X * Steve Tynor
- X * tynor@prism.gatech.edu
- X *
- X * This program is in the public domain. Permission to copy,
- X * distribute, modify this program is hearby given as long as this header
- X * remains. If you redistribute this program after modifying it, please
- X * document your changes so that I do not take the blame (or credit) for
- X * those changes. If you fix bugs or add features, please send me a
- X * patch so that I can keep the 'official' version up-to-date.
- X *
- X * Bug reports are welcome and I'll make an attempt to fix those
- X * that are reported.
- X *
- X * USE AT YOUR OWN RISK! I assume no responsibility for any
- X * errors in this program, its database or documentation. I will make an
- X * effort to fix bugs, but if you crash and burn because, for example,
- X * fuel estimates in this program were inaccurate, it's your own fault
- X * for trusting somebody else's code! Remember, as PIC, it's _your_
- X * responsibility to do complete preflight planning. Use this program as
- X * a flight planning aid, but verify its results before using them.
- X *----------------------------------------------------------------------------
- X */
- X
- Xstatic char rcsid[] = "$Id: main.c,v 2.12 89/11/11 19:13:48 tynor Exp $";
- X
- X#include <stdio.h>
- X#include "wp_info.h"
- X#include "version.h"
- X
- X#define EXIT_GOOD 0
- X#define EXIT_BAD 1
- X
- Xextern FILE *yyin;
- Xextern BOOLEAN open_dbs ();
- Xextern BOOLEAN close_dbs ();
- Xextern BOOLEAN compute_plan ();
- Xextern void print_plan ();
- Xextern void set_output_units ();
- Xextern void set_format ();
- Xextern void set_brief ();
- Xextern char yytext[];
- Xextern BOOLEAN lookup_desig ();
- Xextern void put_db_summary ();
- Xextern void print_reverse ();
- X
- X/*
- X * if any of the GFX_* options are defined, define GFX
- X */
- X#ifdef GFX_SUNVIEW
- X#define GFX
- X#endif
- X#ifdef GFX_X
- X#undef GFX
- X#define GFX
- X#endif
- X#ifdef GFX_POSTSCRIPT
- X#undef GFX
- X#define GFX
- X#endif
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void do_lookup (desig)
- X char *desig;
- X{
- X DATABASE_INFO *db1 = (DATABASE_INFO*)0;
- X DATABASE_INFO *db2 = (DATABASE_INFO*)0;
- X
- X if (lookup_desig (WP_VIA, desig, &db1))
- X put_db (stdout, db1);
- X
- X if (lookup_desig (WP_FROM, desig, &db2))
- X if (!db1 || (db1->mode != db2->mode))
- X put_db (stdout, db2);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void init (brief)
- X BOOLEAN brief;
- X{
- X /*
- X * NOTE: we count on all variables being set to 0 (thus all optional values
- X * are 'off' by default).
- X */
- X num_waypoints = 0;
- X num_cached = 0;
- X set_brief (brief);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic BOOLEAN parse_script ()
- X{
- X return (BOOLEAN) (! yyparse ());
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xusage (progname)
- X char *progname;
- X{
- X fprintf (stderr, "FPLAN %s\n", VERSION);
- X /*
- X * LOOKUP mode:
- X */
- X fprintf (stderr, "usage: %s -l designator ...\n", progname);
- X fprintf (stderr, "\t-l - lookup the designator(s) in the databases\n");
- X
- X /*
- X * REVERSE mode:
- X */
- X fprintf (stderr, " or\n");
- X fprintf (stderr, " %s -r [-|planfile]\n", progname);
- X fprintf (stderr, "\t-r - compute the return trip, prints the reversed plan to stdout.\n");
- X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
- X
- X#ifdef GFX
- X /*
- X * GRAPHICS mode:
- X */
- X fprintf (stderr, " or\n");
- X fprintf (stderr, " %s -g [-|planfile]\n", progname);
- X
- X#ifdef GFX_SUNVIEW
- X fprintf (stderr, "\t-g - preview the route graphically in a Sunview window\n");
- X#endif /* GFX_SUNVIEW */
- X#ifdef GFX_X
- X fprintf (stderr, "\t-g - preview the route graphically in an X window\n");
- X#endif /* GFX_X*/
- X#ifdef GFX_POSTSCRIPT
- X fprintf (stderr, "\t-g - create a PostScript program to draw the route\n");
- X#endif /* GFX_POSTSCRIPT*/
- X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
- X#endif /* GFX */
- X
- X /*
- X * NORMAL mode:
- X */
- X fprintf (stderr, " or\n");
- X fprintf (stderr, " %s [-n|w][-b][-t][-s][-e][-|planfile]\n",
- X progname);
- X fprintf (stderr, "\t-n - selects the narrow (no VOR fixes) format form [default]\n");
- X fprintf (stderr, "\t-w - selects the wide (VOR fixes) format form \n");
- X fprintf (stderr, "\t-s - selects Statute miles for output format [default = Nautical]\n");
- X fprintf (stderr, "\t-t - disable automatically tracking navaids in NAV1 [default = enabled]\n");
- X fprintf (stderr, "\t-b - set BRIEF mode - ignore 'incremental' waypoints\n");
- X fprintf (stderr, "\t-e - use Epson (PC) box characters on output form\n");
- X fprintf (stderr, "\t-d - append a summary of all database objects used\n");
- X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
- X fprintf (stderr, " the planfile format is described in FPLAN(1)\n");
- X exit (EXIT_BAD);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xint main (argc, argv)
- X int argc;
- X char *argv[];
- X{
- X enum {WIDE, NARROW} format = NARROW;
- X int i;
- X BOOLEAN auto_nav1 = TRUE;
- X BOOLEAN brief = FALSE;
- X BOOLEAN epson_box_chars = FALSE;
- X BOOLEAN reverse = FALSE;
- X BOOLEAN database_summary = FALSE;
- X#ifdef GFX_SUNVIEW
- X BOOLEAN draw_sunview = FALSE;
- X#endif
- X#ifdef GFX_X
- X BOOLEAN draw_x = FALSE;
- X#endif
- X#ifdef GFX_POSTSCRIPT
- X BOOLEAN draw_postscript = FALSE;
- X#endif
- X
- X if (argc < 2)
- X usage (argv[0]);
- X
- X if (! open_dbs ())
- X exit (EXIT_BAD);
- X
- X if ((argv[1][0] == '-') && (argv[1][1] == 'l')) {
- X for (i = 2; i < argc; i++)
- X do_lookup (argv[i]);
- X exit (EXIT_GOOD);
- X }
- X
- X yyin = NULL;
- X set_output_units (1);
- X for (i = 1; i < argc; i++) {
- X if (argv[i][0] == '-') {
- X switch (argv[i][1]) {
- X case 'g':
- X /*
- X *leave these separate for now, we'll probably want to link in all
- X * three on some systems...
- X */
- X#ifdef GFX_SUNVIEW
- X draw_sunview = TRUE;
- X#endif
- X#ifdef GFX_X
- X draw_x = TRUE;
- X#endif
- X#ifdef GFX_POSTSCRIPT
- X draw_postscript = TRUE;
- X#endif
- X break;
- X case 'r':
- X reverse = TRUE;
- X break;
- X case 'e':
- X epson_box_chars = TRUE;
- X break;
- X case 'd':
- X database_summary = TRUE;
- X break;
- X case 's':
- X set_output_units (0);
- X break;
- X case 'n':
- X format = NARROW;
- X break;
- X case 'w':
- X format = WIDE;
- X break;
- X case 'b':
- X brief = TRUE;
- X break;
- X case 't':
- X auto_nav1 = FALSE;
- X break;
- X case '\0':
- X if (yyin) {
- X fprintf (stderr,
- X "ERROR: cannot read from stdin and planfile: \"%s\".\n",
- X argv[i]);
- X usage (argv[0]);
- X } else {
- X yyin = stdin;
- X }
- X break;
- X default:
- X fprintf (stderr, "ERROR: unknown option: \"%s\".\n", argv[i]);
- X usage (argv[0]);
- X break;
- X }
- X } else {
- X if (yyin) {
- X fprintf (stderr, "ERROR: only one planfile allowed: \"%s\".\n",
- X argv[i]);
- X usage (argv[0]);
- X } else {
- X yyin = fopen (argv[i], "r");
- X if (! yyin) {
- X fprintf (stderr, "ERROR: could not open script file: %s.\n",
- X argv[i]);
- X usage (argv[0]);
- X }
- X }
- X }
- X }
- X
- X if (! yyin) {
- X fprintf (stderr, "ERROR: no planfile\n");
- X usage (argv[0]);
- X }
- X init (brief);
- X
- X if (! parse_script ())
- X exit (EXIT_BAD);
- X
- X if (! compute_plan (auto_nav1) )
- X exit (EXIT_BAD);
- X
- X if (reverse) {
- X print_reverse ();
- X#ifdef GFX_SUNVIEW
- X } else if (draw_sunview) {
- X sv_draw (brief);
- X#endif
- X#ifdef GFX_X
- X } else if (draw_x) {
- X x_draw (brief);
- X#endif
- X#ifdef GFX_POSTSCRIPT
- X } else if (draw_postscript) {
- X ps_draw (brief);
- X#endif
- X } else {
- X if (format == NARROW)
- X max_nav = -1;
- X else if (auto_nav1)
- X max_nav = MAX (0, max_nav);
- X set_format (max_nav, epson_box_chars);
- X
- X print_plan ();
- X
- X if (database_summary)
- X put_db_summary (stdout);
- X }
- X
- X if (! close_dbs ())
- X exit (EXIT_BAD);
- X}
- X
- X
- X/*----------------------------------------------------------------------------*/
- Xint yyerror(s)
- Xchar* s;
- X{
- X extern int yylineno;
- X
- X fprintf (stderr, "ERROR: line %d: %s\n", yylineno, s);
- X exit (EXIT_BAD);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xint yywrap ()
- X{
- X return (1);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xint yyreject ()
- X{
- X printf ("ERROR: parser rejecting %s\n", yytext);
- X return (1);
- X}
- X
- SHAR_EOF
- chmod 0444 main.c || echo "restore of main.c fails"
- echo "x - extracting misc.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > misc.c &&
- X/*
- X * $Id: misc.c,v 2.3 89/11/05 11:23:46 tynor Exp $
- X *----------------------------------------------------------------------------
- X * FPLAN - Flight Planner
- X * Steve Tynor
- X * tynor@prism.gatech.edu
- X *
- X * This program is in the public domain. Permission to copy,
- X * distribute, modify this program is hearby given as long as this header
- X * remains. If you redistribute this program after modifying it, please
- X * document your changes so that I do not take the blame (or credit) for
- X * those changes. If you fix bugs or add features, please send me a
- X * patch so that I can keep the 'official' version up-to-date.
- X *
- X * Bug reports are welcome and I'll make an attempt to fix those
- X * that are reported.
- X *
- X * USE AT YOUR OWN RISK! I assume no responsibility for any
- X * errors in this program, its database or documentation. I will make an
- X * effort to fix bugs, but if you crash and burn because, for example,
- X * fuel estimates in this program were inaccurate, it's your own fault
- X * for trusting somebody else's code! Remember, as PIC, it's _your_
- X * responsibility to do complete preflight planning. Use this program as
- X * a flight planning aid, but verify its results before using them.
- X *----------------------------------------------------------------------------
- X */
- X
- Xstatic char rcsid[] = "$Id: misc.c,v 2.3 89/11/05 11:23:46 tynor Exp $";
- X
- X#include <math.h>
- X
- X/*----------------------------------------------------------------------------*/
- Xdouble degrees_mins_2_decimal (hm)
- X double hm;
- X{
- X /*
- X * input looks like: 40.45 (40 deg, 45 min), output is 40.75 (40.75 deg)
- X */
- X double i = (double) floor (hm);
- X
- X return (i + (hm - i) / 0.6);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xdouble decimal_2_degrees_mins (dec)
- X double dec;
- X{
- X /*
- X * input looks like: 40.75 (40.75 deg), output is 40 and 45 (40 deg, 45 min)
- X */
- X double tmp = (double) floor (dec);
- X
- X return (tmp + 0.6 * (dec - tmp));
- X}
- X
- SHAR_EOF
- chmod 0444 misc.c || echo "restore of misc.c fails"
- echo "x - extracting db.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > db.c &&
- X/*
- X * $Id: db.c,v 2.9 89/11/11 19:09:34 tynor Exp $
- X *----------------------------------------------------------------------------
- X * FPLAN - Flight Planner
- X * Steve Tynor
- X * tynor@prism.gatech.edu
- X *
- X * This program is in the public domain. Permission to copy,
- X * distribute, modify this program is hearby given as long as this header
- X * remains. If you redistribute this program after modifying it, please
- X * document your changes so that I do not take the blame (or credit) for
- X * those changes. If you fix bugs or add features, please send me a
- X * patch so that I can keep the 'official' version up-to-date.
- X *
- X * Bug reports are welcome and I'll make an attempt to fix those
- X * that are reported.
- X *
- X * USE AT YOUR OWN RISK! I assume no responsibility for any
- X * errors in this program, its database or documentation. I will make an
- X * effort to fix bugs, but if you crash and burn because, for example,
- X * fuel estimates in this program were inaccurate, it's your own fault
- X * for trusting somebody else's code! Remember, as PIC, it's _your_
- X * responsibility to do complete preflight planning. Use this program as
- X * a flight planning aid, but verify its results before using them.
- X *----------------------------------------------------------------------------
- X */
- X
- X#include "mystring.h"
- X#include <stdio.h>
- X#include <ctype.h>
- X#include "wp_info.h"
- X
- Xextern char *malloc();
- Xextern char *getenv();
- Xextern int qsort();
- X
- Xstatic char rcsid[] = "$Id: db.c,v 2.9 89/11/11 19:09:34 tynor Exp $";
- X
- X/*
- X * the database file pointers:
- X */
- X
- Xtypedef struct {
- X FILE *fp;
- X long rec_size;
- X long num_recs;
- X} DB_FILE;
- X
- X
- XDB_FILE pub_airports, pvt_airports, pub_vors, pvt_vors;
- X
- X/*
- X * environment variables for where the databases are:
- X */
- X#define HOME "HOME"
- X#define NAV_PUBLIC "NAV"
- X#define NAV_PRIVATE "NAV_PRIVATE"
- X
- X#ifndef DEFAULT_PVT_DIRECTORY
- X#ifdef MSDOS
- X#define DEFAULT_PVT_DIRECTORY "\\flight"
- X#else
- X#define DEFAULT_PVT_DIRECTORY "~/preflight"
- X#endif
- X#endif
- X
- X#ifndef DEFAULT_PUB_DIRECTORY
- X#ifdef MSDOS
- X#define DEFAULT_PUB_DIRECTORY "\\lib\\flight"
- X#else
- X#define DEFAULT_PUB_DIRECTORY "/usr/local/lib/preflight"
- X#endif
- X#endif
- X
- X#ifdef MSDOS
- X#define AIRPORTS_NAME "\\airports.nav"
- X#define VORS_NAME "\\vors.nav"
- X#else
- X#define AIRPORTS_NAME "/airports.nav"
- X#define VORS_NAME "/vors.nav"
- X#endif
- X
- X#define FSEEK_FROM_BEGINNING 0
- X#define FSEEK_FROM_CURRENT 1
- X#define FSEEK_FROM_END 2
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic long get_rec_size (buffer)
- Xchar *buffer;
- X{
- X long i;
- X
- X for (i = 0;; i++) {
- X if (buffer[i] == '\n') {
- X return (i + 1L);
- X }
- X }
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic long get_num_recs (rec_size, fp, filename)
- X long rec_size;
- X FILE **fp;
- X char *filename;
- X{
- X long file_size;
- X
- X if (fseek (*fp, 0L, FSEEK_FROM_END)) {
- X fprintf (stderr, "ERROR: could not seek in db file: %s\n", filename);
- X *fp = NULL;
- X return (0L);
- X }
- X file_size = ftell (*fp);
- X
- X#ifndef MSDOS
- X /*
- X * can't figure out why MSC doesn't do this properly - maybe it's an
- X * inconsistency in the way fseek works? For now, just assume that
- X * database is in the proper format.
- X */
- X if ((file_size % rec_size) != 0L) {
- X fprintf (stderr,
- X "ERROR: file size (%ld/%ld) inconsistency in db file: %s\n",
- X file_size, rec_size, filename);
- X *fp = NULL;
- X return (0L);
- X }
- X#endif
- X return (file_size / rec_size);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- XBOOLEAN open_dbs ()
- X{
- X char *pub_dir, *pvt_dir;
- X BOOLEAN ok;
- X
- X#define BUFSIZE 200
- X char filename[BUFSIZE];
- X char buffer[BUFSIZE];
- X
- X#ifdef MSDOS
- X#define OPEN_MODE "rb"
- X#else
- X#define OPEN_MODE "r"
- X#endif
- X
- X if (! (pub_dir = getenv (NAV_PUBLIC)))
- X pub_dir = DEFAULT_PUB_DIRECTORY;
- X
- X if (! (pvt_dir = getenv (NAV_PRIVATE)))
- X pvt_dir = DEFAULT_PVT_DIRECTORY;
- X
- X#ifndef MSDOS
- X if (pvt_dir[0] == '~') {
- X strcpy (filename, getenv (HOME));
- X strcat (filename, &pvt_dir[1]);
- X pvt_dir = strdup (filename);
- X }
- X#endif
- X
- X strcpy (filename, pub_dir);
- X strcat (filename, AIRPORTS_NAME);
- X if (pub_airports.fp = fopen (filename, OPEN_MODE)) {
- X fgets (buffer, BUFSIZE, pub_airports.fp);
- X pub_airports.rec_size = get_rec_size (buffer);
- X pub_airports.num_recs = get_num_recs (pub_airports.rec_size,
- X &pub_airports.fp, filename);
- X }
- X
- X strcpy (filename, pvt_dir);
- X strcat (filename, AIRPORTS_NAME);
- X if (pvt_airports.fp = fopen (filename, OPEN_MODE)) {
- X fgets (buffer, BUFSIZE, pvt_airports.fp);
- X pvt_airports.rec_size = get_rec_size (buffer);
- X pvt_airports.num_recs = get_num_recs (pvt_airports.rec_size,
- X &pvt_airports.fp, filename);
- X }
- X
- X strcpy (filename, pub_dir);
- X strcat (filename, VORS_NAME);
- X if (pub_vors.fp = fopen (filename, OPEN_MODE)) {
- X fgets (buffer, BUFSIZE, pub_vors.fp);
- X pub_vors.rec_size = get_rec_size (buffer);
- X pub_vors.num_recs = get_num_recs (pub_vors.rec_size,
- X &pub_vors.fp, filename);
- X }
- X
- X strcpy (filename, pvt_dir);
- X strcat (filename, VORS_NAME);
- X if (pvt_vors.fp = fopen (filename, OPEN_MODE)) {
- X fgets (buffer, BUFSIZE, pvt_vors.fp);
- X pvt_vors.rec_size = get_rec_size (buffer);
- X pvt_vors.num_recs = get_num_recs (pvt_vors.rec_size,
- X &pvt_vors.fp, filename);
- X }
- X ok = TRUE;
- X
- X if (!pub_airports.fp && !pvt_airports.fp) {
- X ok = FALSE;
- X fprintf (stderr, "ERROR: neither public or private airports db found\n");
- X }
- X if (!pub_vors.fp && !pvt_vors.fp) {
- X ok = FALSE;
- X fprintf (stderr, "ERROR: neither public or private vors db found\n");
- X }
- X return (ok);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- XBOOLEAN close_dbs ()
- X{
- X if (pub_airports.fp)
- X fclose (pub_airports.fp);
- X if (pvt_airports.fp)
- X fclose (pvt_airports.fp);
- X if (pub_vors.fp)
- X fclose (pub_vors.fp);
- X if (pvt_vors.fp)
- X fclose (pvt_vors.fp);
- X
- X return (TRUE);
- X}
- X
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic BOOLEAN lookup_desig_internal (db, desig, buffer_size, buffer)
- X DB_FILE db;
- X char *desig;
- X int buffer_size;
- X char *buffer;
- X{
- X long low, high, mid;
- X int cmp;
- X if (! db.fp)
- X return FALSE;
- X
- X#ifdef NO_BINARY_SEARCH
- X rewind (db.fp);
- X while (fgets (buffer, buffer_size, db.fp)) {
- X if (!strcmp (desig, strtok (buffer, ":\n")))
- X return TRUE;
- X }
- X return FALSE;
- X#else
- X low = 0L;
- X high = db.num_recs;
- X while (low <= high) {
- X mid = (low + high) / 2L;
- X fseek (db.fp, mid * db.rec_size, FSEEK_FROM_BEGINNING);
- X fgets (buffer, buffer_size, db.fp);
- X cmp =strcmp (desig, strtok (buffer, ":\n"));
- X if (!cmp)
- X return TRUE;
- X else if (cmp > 0)
- X low = mid + 1;
- X else
- X high = mid - 1;
- X }
- X return FALSE;
- X#endif
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void decode_common (db)
- X DATABASE_INFO *db;
- X{
- X extern double atof ();
- X extern double degrees_mins_2_decimal ();
- X double d1, d2;
- X
- X db->altitude.value = atof (strtok ((char*)0, ":\n"));
- X db->altitude.valid = TRUE;
- X
- X d1 = atof (strtok ((char*)0, ":\n"));
- X d2 = atof (strtok ((char*)0, ":\n"));
- X db->mag_variation = d1 + d2 / 60.0;
- X
- X d1 = atof (strtok ((char*)0, ":\n"));
- X d2 = atof (strtok ((char*)0, ":\n"));
- X db->latitude = d1 + d2 / 60.0;
- X
- X d1 = atof (strtok ((char*)0, ":\n"));
- X d2 = atof (strtok ((char*)0, ":\n"));
- X db->longitude = d1 + d2 / 60.0;
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void decode_vor (db)
- X DATABASE_INFO *db;
- X{
- X char *tok;
- X
- X db->name = strdup (strtok ((char*)0, ":\n"));
- X
- X tok = strdup (strtok ((char*)0, ":\n"));
- X if (tok[0] != '\0') {
- X db->freq.valid = TRUE;
- X db->freq.value = atof (tok);
- X } else
- X db->freq.valid = FALSE;
- X
- X decode_common (db);
- X
- X tok = strtok ((char*)0, ":\n");
- X if (!strcmp ("NDB", tok))
- X db->mode = WP_NDB;
- X else if (!strcmp ("VOR", tok))
- X db->mode = WP_VOR;
- X else if (!strcmp ("DME", tok))
- X db->mode = WP_DME;
- X else if (!strcmp ("TAC", tok))
- X db->mode = WP_TAC;
- X else if (!strcmp ("ILS", tok))
- X db->mode = WP_ILS;
- X else if (!strcmp ("INT", tok))
- X db->mode = WP_NAMED_INTERSECTION;
- X else if (!strcmp ("WPT", tok))
- X db->mode = WP_WPT;
- X else if (!strcmp ("LOM", tok))
- X db->mode = WP_LOM;
- X else if (!strcmp ("LMM", tok))
- X db->mode = WP_LMM;
- X else
- X db->mode = WP_UNK;
- X
- X tok = strtok ((char*)0, ":\n");
- X if (tok)
- X db->comment = strdup (tok);
- X else
- X db->comment = NULL;
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void decode_airport (db)
- X DATABASE_INFO *db;
- X{
- X char *tok;
- X
- X db->mode = WP_AIRPORT;
- X db->city = strdup (strtok ((char*)0, ":\n"));
- X db->name = strdup (strtok ((char*)0, ":\n"));
- X
- X decode_common (db);
- X
- X tok = strdup (strtok ((char*)0, ":\n"));
- X
- X if (tok[0] != '\0') {
- X db->freq.valid = TRUE;
- X db->freq.value = atof (tok);
- X } else
- X db->freq.valid = FALSE;
- X
- X tok = strtok ((char*)0, ":\n");
- X if (tok)
- X db->comment = strdup (tok);
- X else
- X db->comment = NULL;
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic void str_upcase (str)
- X char *str;
- X{
- X int i;
- X
- X for (i = 0; str[i] != '\0'; i++)
- X if (islower (str[i]))
- X str[i] = toupper (str[i]);
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic BOOLEAN in_cache (mode, desig)
- X WAYPOINT_MODE mode;
- X char *desig;
- X{
- X int i;
- X
- X for (i = 0; i < num_cached; i++) {
- X if ((!strcmp (desig, cache[i]->desig)) &&
- X (mode == cache[i]->mode)) {
- X return TRUE;
- X }
- X }
- X return FALSE;
- X}
- X
- X/*----------------------------------------------------------------------------*/
- XBOOLEAN lookup_desig (kind, desig, db)
- X WAYPOINT_KIND kind;
- X char *desig;
- X DATABASE_INFO **db;
- X{
- X#undef BUFSIZE
- X#define BUFSIZE 200
- X char buffer [BUFSIZE];
- X DB_FILE fps[4];
- X int i;
- X BOOLEAN found;
- X extern yyerror();
- X enum {VOR, AIRPORT} db_kind;
- X
- X str_upcase (desig);
- X
- X if (kind == WP_VIA) {
- X /*
- X * prefer the VOR databases
- X */
- X fps[0] = pvt_vors;
- X fps[1] = pub_vors;
- X fps[2] = pvt_airports;
- X fps[3] = pub_airports;
- X } else {
- X /*
- X * prefer the AIRPORT databases
- X */
- X fps[0] = pvt_airports;
- X fps[1] = pub_airports;
- X fps[2] = pvt_vors;
- X fps[3] = pub_vors;
- X }
- X
- X for (i = 0; i < 4; i++) {
- X if (found = lookup_desig_internal (fps[i], desig, BUFSIZE, buffer)) {
- X#if 0
- X printf ("%s found w/db %d[%ld] (%s)\n",desig,i,fps[i].fp,
- X ((fps[i].fp == pub_airports.fp) ||
- X (fps[i].fp == pvt_airports.fp)) ? "APT" : "VOR");
- X#endif
- X if ((fps[i].fp == pub_airports.fp) || (fps[i].fp == pvt_airports.fp))
- X db_kind = AIRPORT;
- X else
- X db_kind = VOR;
- X break;
- X }
- X }
- X if (! found) {
- X fprintf (stderr, "ERROR: could not find %s in any database\n", desig);
- X return FALSE;
- X }
- X
- X /*
- X * now, convert it into a db record...
- X */
- X
- X *db = (DATABASE_INFO*) malloc (sizeof (DATABASE_INFO));
- X if (! *db)
- X yyerror ("unable to allocate space for database element");
- X
- X (*db)->desig = desig; /* no need to strdup - the parser already did */
- X
- X if (db_kind == VOR)
- X decode_vor (*db);
- X else
- X decode_airport (*db);
- X
- X /*
- X * append to the cache: (NOTE: it might already be there if we didn't grab
- X * it out of the cach because of incompatible modes - e.g. the cached wp is
- X * an airport, but this is a via node - we forced a recheck in case there was
- X * a navaid with the same desig)
- X */
- X if (num_cached < CACHE_SIZE)
- X if (! in_cache ((*db)->mode, desig)) {
- X cache[num_cached++] = *db;
- X }
- X return TRUE;
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xstatic int dbcmp (db1, db2)
- X DATABASE_INFO **db1, **db2;
- X{
- X return (strcmp ((*db1)->desig, (*db2)->desig));
- X}
- X
- X/*----------------------------------------------------------------------------*/
- Xvoid put_db_summary (out_fp)
- X FILE *out_fp;
- X{
- X int i;
- X
- X /*
- X * first, sort the cache
- X */
- X qsort ((char*) &cache[0], num_cached, sizeof(DATABASE_INFO*), dbcmp);
- X
- X /*
- X * now, print it out.
- X */
- X fprintf (out_fp, "\f\n");
- X for (i = 0; i < num_cached; i++)
- X put_db (out_fp, cache[i]);
- X}
- X
- X
- X/*----------------------------------------------------------------------------*/
- Xvoid min_max_lat_long (min_lat, max_lat, min_long, max_long)
- X double *min_lat, *max_lat, *min_long, *max_long;
- X{
- X int i;
- X
- X *min_lat = 190.0;
- X *max_lat = -190.0;
- X *min_long = 190.0;
- X *max_long = -190.0;
- X
- X for (i = 0; i < num_cached; i++) {
- X *min_lat = MIN (cache[i]->latitude, *min_lat);
- X *max_lat = MAX (cache[i]->latitude, *max_lat);
- X *min_long = MIN (cache[i]->longitude, *min_long);
- X *max_long = MAX (cache[i]->longitude, *max_long);
- X }
- X}
- SHAR_EOF
- chmod 0444 db.c || echo "restore of db.c fails"
- echo "x - extracting strings.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > strings.c &&
- X/*
- X * $Id: strings.c,v 1.7 89/11/11 19:13:40 tynor Exp $
- X *----------------------------------------------------------------------------
- X * FPLAN - Flight Planner
- X * Steve Tynor
- X * tynor@prism.gatech.edu
- X *
- X * This program is in the public domain. Permission to copy,
- X * distribute, modify this program is hearby given as long as this header
- X * remains. If you redistribute this program after modifying it, please
- X * document your changes so that I do not take the blame (or credit) for
- X * those changes. If you fix bugs or add features, please send me a
- X * patch so that I can keep the 'official' version up-to-date.
- X *
- X * Bug reports are welcome and I'll make an attempt to fix those
- X * that are reported.
- X *
- X * USE AT YOUR OWN RISK! I assume no responsibility for any
- X * errors in this program, its database or documentation. I will make an
- X * effort to fix bugs, but if you crash and burn because, for example,
- X * fuel estimates in this program were inaccurate, it's your own fault
- X * for trusting somebody else's code! Remember, as PIC, it's _your_
- X * responsibility to do complete preflight planning. Use this program as
- X * a flight planning aid, but verify its results before using them.
- X *----------------------------------------------------------------------------
- X */
- X
- Xstatic char rcsid[] = "$Id: strings.c,v 1.7 89/11/11 19:13:40 tynor Exp $";
- X
- X#include "mystring.h"
- X#include "wp_info.h"
- X#include "math.h"
- X
- Xextern char* malloc();
- X
- X/*
- X * define a couple of functions that are in SunOS string(3), but apparently
- X * aren't 'standard' - so much for the wonder of the portability of the
- X * standard C library...
- X *
- X * The only thing we count on is strlen().
- X */
- X
- X/*---------------------------------------------------------------------------*/
- Xchar* index (s, c)
- X char *s, c;
- X{
- X char *p;
- X for (p = s; *p; p++)
- X if (*p == c)
- X return p;
- X if (!c)
- X return p;
- X else
- X return (char*) 0;
- X}
- X
- X/*---------------------------------------------------------------------------*/
- Xchar* strdup (s)
- X char *s;
- X{
- X int len = strlen (s);
- X char *new = (char*) malloc (len + 1);
- X
- X if (new)
- X strcpy (new, s);
- X return (new);
- X}
- X
- Xstatic char *buffer;
- Xstatic int start;
- Xstatic int buf_len;
- X
- X/*---------------------------------------------------------------------------*/
- Xchar *strtok (str, separators)
- X char *str;
- X char *separators;
- X{
- X int i, k;
- X int len = strlen (separators);
- X char *ptr;
- X
- X if (str) {
- X buf_len = strlen (str);
- X buffer = str;
- X start = 0;
- X }
- X if (start > buf_len) {
- X return (char*) 0;
- X }
- X for (i = 0; i <= len; i++) {
- X /*
- X * notice we cheat and use the '\0' terminator in the separators string
- X * to always recognize '\0' as a separator.
- X */
- X if (ptr = index (&buffer[start], separators[i])) {
- X *ptr = '\0';
- X k = start;
- X start = (int) (ptr - buffer + 1);
- X return (&buffer[k]);
- X }
- X }
- X return (char*) 0;
- X}
- X
- SHAR_EOF
- chmod 0444 strings.c || echo "restore of strings.c fails"
- exit 0
-
-